package kr.pe.johnkim.sendme.util;


import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;

import kr.pe.johnkim.sendme.provider.SendMeVoice;

import org.apache.commons.io.IOUtils;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;


/**
 * 오디오 녹음 파일을 관리하는 sqlite DB 처리를 위해 사용하는 DBManager 이다.
 * @author blue
 * 
 * nick name 은 사용하지 않음. name 자리에 넣기로 함.
 *
 */
public class SendMeDBManagerAudioRecord {
	
	String TAG = "SendMeDBManagerAudioRecord";
	
	// DB관련 상수 선언
    private static final String dbName = "AudioRecordInfo5.db";		// test		// test 가 끝나면 AudioRecordInfo 로 복원하고 데이터 모두 지운후 재설치하도록..
    
//    private static final String tableName = "APinfo";										// 원본(샘플)에서 생성하는 테이블명
   
    private static final String tableNameTempAudio = "TempAudioInfoTable";					// 임시 저장 파일 정보 테이블 - 사용자 아이디 / 받는 사람(들) 이름(아이디) / 파일 저장될 경로(+파일명) / 날짜
    private static final String tableNameDownloadAudio = "DownloadAudioInfoTable";			// 다운로드 파일 정보 테이블 - 사용자 아이디 / 보낸 사람 이름(아이디) / 파일 저장될 경로(+파일명) / 날짜
    
    public static final int dbVersion = 1;
 
    // DB관련 객체 선언
    private OpenHelper opener; // DB opener
    private SQLiteDatabase db; // DB controller
 
    // 부가적인 객체들
    private Context context;
 
    
    
    
    // 생성자
    public SendMeDBManagerAudioRecord(Context context) {
        this.context = context;
        this.opener = new OpenHelper(context, dbName, null, dbVersion);
        db = opener.getWritableDatabase();
    }
 
    // Opener of DB and Table
    private class OpenHelper extends SQLiteOpenHelper {
 
        public OpenHelper(Context context, String name, CursorFactory factory,
                int version) {
            super(context, name, null, version);
            // TODO Auto-generated constructor stub
        }
 
        // 생성된 DB가 없을 경우에 한번만 호출됨
        @Override
        public void onCreate(SQLiteDatabase arg0) {
        	
        	Log.d(TAG,"onCreate::"+arg0.getPath());
            
            /*
             * 임시 저장 정보를 저장할 테이블 생성
             */
            String createTempAudioSql = "create table " + tableNameTempAudio + " ("
                    + "id_temp_audio integer primary key autoincrement, " 
                    + "sender text, "							// 사용자 아이디
            		+ "receiver_phone text, "						// 받는 사람(들) 전번. 여러명일 경우 (, 또는 /) 같은 기호로 구분
            		+ "receiver_name text, "						// 받는 사람(들) 이름. 여러명일 경우 (, 또는 /) 같은 기호로 구분
            		+ "register_date text, "					// 날짜                    
            		+ "modify_date text, " 						// 날짜
            		+ "file_name text, " 						// 원본 파일명
            		+ "file_path text, " 						// 파일 저장될 경로(+파일명)
            		+ "file_content BLOB)";					// 파일
            arg0.execSQL(createTempAudioSql);
         // 보낼때 임시 저장시
//          private String sender;                  // 생성자. 보내는 멤버 아이디.         // 내 아이디
//          private String receiver;                    // 받는 사용자 아이디.				// 받는 사용자 아이디
//          private String registerDate;            // 등록 일자.      						// 현시각
//          private String modifyDate;              // 수정 일자.        					// 현시각
//          private String fileName;                    // 음성 파일 명.
            
//          private byte[] fileContent;  //private File file;                // 음성 파일. DB에 저장시
            // String filePath;				// 로컬에 저장하고 DB에 경로 저장시
            
            /*
             * 다운로드 파일 정보를 저장할 테이블 생성
             */
            String createDownloadAudioql = "create table " + tableNameDownloadAudio + " ("
                    + "id_download_audio integer primary key autoincrement, " 
//                    + "idSendMeVoice text, "							// 테이블 아이디
                    
                    + "sender_phone text, "							    	// 보낸 사람 전번
                    + "sender_name text, "							    	// 보낸 사람 이름
                    
                    + "register_date text, "								// 등록 일자
                    + "modify_date text, "								// 수정 일자
                    + "receiver text, "									// 받는 사용자 아이디
//                    + "sendMeVoiceIdSendMeVoice text, "					// 음성 메시지 테이블 아이디(SENDME_VOICE 테이블 PK)	
//                    + "sendMeVoiceSender text, "						// 음성 메시지 생성자. 보내는 멤버 아이디.(SENDME_VOICE 테이블 PK)  :보낸 사람
            		+ "file_name text, "									// 음성 파일 명
                    + "file_path text, " 								// 파일 저장될 경로(+파일명)
            		+ "file_content BLOB)";								// 파일
            arg0.execSQL(createDownloadAudioql);
            // 받을때 - (담기로 로컬에 저장시) -- 받은 값 중에서.
//        	private String idSendMeVoice;           // 테이블 아이디.      								// 받은 값
//          private String sender;                  // 생성자. 보내는 멤버 아이디.         	// 보낸 사람
//          private String registerDate;            // 등록 일자.      					
//          private String modifyDate;              // 수정 일자.        
//          private String receiver;                // 받는 사용자 아이디.					// 받는 사람
//          private String sendMeVoiceIdSendMeVoice;    // 음성 메시지 테이블 아이디.(SENDME_VOICE 테이블 PK)					// 받은값
//          private String sendMeVoiceSender;           // 음성 메시지 생성자. 보내는 멤버 아이디.(SENDME_VOICE 테이블 PK)		// 보낸 사람
//          private String fileName;                    // 음성 파일 명.					// 파일명
            
//          private byte[] fileContent;  //private File file;                // 음성 파일. DB에 저장시
            // String filePath;				// 로컬에 저장하고 DB에 경로 저장시
            
//            try {
//				Log.d(TAG,"11");
//				// file -> byte
//				InputStream stream = new FileInputStream(tempMP3FileName());
//				byte[] payload = IOUtils.toByteArray(stream);
//				Log.d(TAG,"payload:"+payload.length);
//
//				// byte -> file
//				ByteArrayOutputStream baos = new ByteArrayOutputStream();
//				byte[] payload3 = payload;
//				Log.d(TAG,"payload3::"+payload3.length);
//				baos.write(payload3);
//				String tempFileName = Environment.getExternalStorageDirectory() + "/"+System.currentTimeMillis() +".mp3";
//				OutputStream os = new FileOutputStream(tempFileName);
//				baos.writeTo(os);
//				os.close();
//				baos.close();
//			} catch (Exception e) {
//				e.printStackTrace();
//			}
            
//            Toast.makeText(context, "DB is opened", 0).show();
        }
 
        @Override
        public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
            // TODO Auto-generated method stub
        }
    }
 
    
   //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 임시 보관함
  /*
   *  데이터 추가 - 생성된 음성 메시지를 임시 저장한다. 
   */
    public boolean insertTempAudioData(SendMeVoice sendMeVoice) {
    	boolean returnVal = false;
    	try {

    		ContentValues values = new ContentValues();

    		values.put("sender",sendMeVoice.getSender());
    		
    		values.put("receiver_phone",sendMeVoice.getReceiver());
    		values.put("receiver_name",sendMeVoice.getReceiverName());
    		
    		values.put("register_date",sendMeVoice.getRegisterDate());
    		values.put("modify_date",sendMeVoice.getModifyDate());
    		
    		values.put("file_name",sendMeVoice.getFileName());

    		values.put("file_path",sendMeVoice.getFilePath());
//    		values.put("file_content",fileContentByte);

    		long result = db.insert(tableNameTempAudio, null, values);
    		Log.d(TAG,"insertTempAudioData result:"+result);		// 데이터 입력 후 입력된 레코드 ID. 에러시 -1.     // row ID of the newly inserted row, or -1 if an error occurred 
    		if(result!=-1) {		// SUCCESS
    			returnVal = true;
    		}
    		db.close();
    	} catch (Exception e) {
    		e.printStackTrace();
    	}
    	return returnVal;
    }
    
    /*
     *  데이터 검색 - 임시 저장 메시지들을 조회한다 
     */
    public ArrayList<SendMeVoice> selectAllTempAudioData() {

    	String sql = "select id_temp_audio, receiver_phone, receiver_name, file_name, file_path, register_date  from " + tableNameTempAudio + ";";
    	ArrayList<SendMeVoice> sendMeVoices = new ArrayList<SendMeVoice>();
    	ArrayList<SendMeVoice> resultSendMeVoices = new ArrayList<SendMeVoice>();
    	
    	SimpleDateFormat receiveMessageDateSimpleDateFormat = SendMeConstant.receiveMessageDateSimpleDateFormat;
		SimpleDateFormat commonDateSimpleDateFormat = SendMeConstant.commonDateSimpleDateFormat;
    	
		// 배열 스트링 변환
		SendMeCommon sendMeCommon = new SendMeCommon();
		String receiverName;
		String[] receiverNameList;
		
    	try {

    		Cursor results = db.rawQuery(sql, null);

    		results.moveToFirst();

    		while (!results.isAfterLast()) {
    			SendMeVoice sendMeVoice = new SendMeVoice();
    			sendMeVoice.setSqliteKey(results.getInt(0)+"");	// id_download_audio // DB테이블 키 : 수정 및 삭제를 위해 필요함
    			sendMeVoice.setReceiver(results.getString(1));		// receiver // 받는사람 : 전송 및 수정을 위해 필요
    			
    			receiverName = results.getString(2);
    			receiverNameList = sendMeCommon.convertStringToArray(receiverName);
    			
    			sendMeVoice.setReceiverCount(receiverNameList.length+"");
    			
    			// 무조건 이름 그대로 둘것. ReceiverCount 으로 분기
				sendMeVoice.setReceiverName(receiverName);		 
    			
    			sendMeVoice.setFileName(results.getString(3));		// file_name // 파일명 : 필요
    			sendMeVoice.setFilePath(results.getString(4));			// file_path // 파일 경로 : 필수
    			
    			// 변환해서 넣을때
				String tempRegisterDate = results.getString(5);		// 받아서
				Date date = commonDateSimpleDateFormat.parse(tempRegisterDate);				// Date 타입으로
				String sdfRegisterDate = receiveMessageDateSimpleDateFormat.format(date);	// 원하는 포맷으로
				sendMeVoice.setRegisterDate(sdfRegisterDate);							// 저장
				
//    			sendMeVoices.add(sendMeVoice);			// 리스트 정방향으로 (마지막 데이터가 가장 아래로)
    			sendMeVoices.add(0, sendMeVoice);		// 리스트 역순으로 (마지막 데이터가 가장 위로)
    			
    			results.moveToNext();
    		}
    		
    		results.close();
    		db.close();
    	} catch (Exception e) {
    		e.printStackTrace();
    	}
    	return sendMeVoices;
    }
    
    /*
     * 데이터 수정 - 임시 저장된 음성 메시지를 수정한다.
     *   그룹원 편집용도
     */
    public boolean updateTempAudioData(SendMeVoice sendMeVoice){

    	ContentValues args = new ContentValues();
    	args.put("receiver_phone", sendMeVoice.getReceiver());
    	args.put("receiver_name", sendMeVoice.getReceiverName());
    	
    	Log.d(TAG,"receiver_phone::"+sendMeVoice.getReceiver());
    	Log.d(TAG,"receiver_name::"+sendMeVoice.getReceiverName());
    	
    	int dbResult = db.update(tableNameTempAudio, args, "id_temp_audio=?", new String[] {sendMeVoice.getSqliteKey()});
    	Log.d(TAG,"dbResult::"+dbResult);
    	db.close();

    	return true;
    }
    
    
  /*
   *  데이터 삭제 - 임시 저장된 음성 메시지를 삭제한다. 
   */
  public boolean deleteTempAudioData(String index) {
//	  boolean returnVal = false;
//	  db.delete(tableNameTempAudio, "id_temp_audio=?", new String[] {index+""});
	  int dbResult = db.delete(tableNameTempAudio, "id_temp_audio=?", new String[] {index});
	  db.close();
	  return true;
  }
  
  
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 저장된 메시지
  /*
   *  데이터 추가 - 받은 음성 메시지를 보관함에 저장한다. 
   */
    public boolean insertDownloadAudioData(SendMeVoice sendMeVoice) {
    	boolean returnVal = false;
    	try {

    		ContentValues values = new ContentValues();

    		values.put("sender_phone",sendMeVoice.getSender());
    		values.put("sender_name",sendMeVoice.getSenderName());
    		
    		values.put("receiver",sendMeVoice.getReceiver());
    		
    		values.put("register_date",sendMeVoice.getRegisterDate());
    		values.put("modify_date",sendMeVoice.getModifyDate());
    		
    		values.put("file_name",sendMeVoice.getFileName());
    		values.put("file_path",sendMeVoice.getFilePath());
//    		values.put("file_content",fileContentByte);

    		long result = db.insert(tableNameDownloadAudio, null, values);
    		Log.d(TAG,"insertDownloadAudioData result:"+result);		// 데이터 입력 후 입력된 레코드 ID. 에러시 -1.     // row ID of the newly inserted row, or -1 if an error occurred 
    		if(result!=-1) {		// SUCCESS
    			returnVal = true;
    		}
    		db.close();
    	} catch (Exception e) {
    		e.printStackTrace();
    	}
    	return returnVal;
    }
    
    /*
     *  데이터 검색 - 보관함의 저장 메시지들을 조회한다 
     */
    public ArrayList<SendMeVoice> selectAllDownloadAudioData() {

    	String sql = "select id_download_audio, sender_phone, sender_name, file_name, file_path, register_date  from " + tableNameDownloadAudio + ";";
    	ArrayList<SendMeVoice> sendMeVoices = new ArrayList<SendMeVoice>();
    	
    	SimpleDateFormat receiveMessageDateSimpleDateFormat = SendMeConstant.receiveMessageDateSimpleDateFormat;
		SimpleDateFormat commonDateSimpleDateFormat = SendMeConstant.commonDateSimpleDateFormat;
		
    	try {

    		Cursor results = db.rawQuery(sql, null);

    		results.moveToFirst();

    		while (!results.isAfterLast()) {
    			SendMeVoice sendMeVoice = new SendMeVoice();
    			sendMeVoice.setSqliteKey(results.getInt(0)+"");		// id_download_audio // DB테이블 키 : 수정 및 삭제를 위해 필요함
    			sendMeVoice.setSender(results.getString(1));		// receiver // 받는사람 : 전송 및 수정을 위해 필요
    			sendMeVoice.setSenderName(results.getString(2));		// receiver // 받는사람 : 전송 및 수정을 위해 필요
    			sendMeVoice.setFileName(results.getString(3));		// file_name // 파일명 : 필요
    			sendMeVoice.setFilePath(results.getString(4));			// file_path // 파일 경로 : 필수
    			
    			// 변환해서 넣을때
				String tempRegisterDate = results.getString(5);		// 받아서
				Date date = commonDateSimpleDateFormat.parse(tempRegisterDate);				// Date 타입으로
				String sdfRegisterDate = receiveMessageDateSimpleDateFormat.format(date);	// 원하는 포맷으로
				sendMeVoice.setRegisterDate(sdfRegisterDate);							// 저장
				
//    			sendMeVoices.add(sendMeVoice);			// 리스트 정방향으로 (마지막 데이터가 가장 아래로)
    			sendMeVoices.add(0, sendMeVoice);		// 리스트 역순으로 (마지막 데이터가 가장 위로)
    			
    			results.moveToNext();
    		}
    		results.close();
    		db.close();
    	} catch (Exception e) {
    		e.printStackTrace();
    	}
    	return sendMeVoices;
    }
    
  /*
   *  데이터 삭제 - 보관함에 저장된 음성 메시지를 삭제한다. 
   */
  public boolean deleteDownloadAudioData(String index) {
	  boolean returnVal = false;
	  int dbResult = db.delete(tableNameDownloadAudio, "id_download_audio=?", new String[] {index});
	  Log.d(TAG,"dbResult::"+dbResult);
	  if(dbResult!=-1){
		  returnVal = true;
	  }
	  db.close();
	  return returnVal;
  }
  
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  
  
  
  
  
  
  
  
  
  
    
//  /*
//   * 테이블 조회 (테스트용) 
//   */
//  public void logCursorInfo(){
//	  
//	  Cursor c = db.query(tableNameTempAudio,null,null,null,null,null,null);
//	  
//	  
//	  Log.d(TAG,"Result:"+c.getCount()+"/Columns:"+c.getColumnCount());		// 데이터 레코드 개수 / 테이블 컬럼 개수
//	  
//	  String rowHeaders="|| ";
//	  for(int i=0; i<c.getColumnCount(); i++){
//		  rowHeaders = rowHeaders.concat(c.getColumnName(i))+" || ";
//	  }
//	  Log.d(TAG,"COLUMNS:"+rowHeaders);
//	  
//	  
//	  c.moveToFirst();
//	  String rowResults="|| ";
//	  for(int i=0; i<c.getColumnCount()-1; i++){
//		  rowResults = rowResults.concat(c.getString(i))+ " || ";
//	  }
////	  rowResults = rowResults.concat((c.getBlob(c.getColumnCount()-1).length+"")+ " || ");	// 마지막 데이터(blob) 크기.
//	  Log.d(TAG,"Row:"+c.getPosition()+"::"+rowResults);
//	  c.moveToNext();
//  }
  
    
//    // 데이터 추가 - 원본(샘플)
//    public void insertData(APinfo info) {
//        String sql = "insert into " + tableName + " values(NULL, '"
//                + info.getSSID() + "', " + info.getCapabilities() + ", '"
//                + info.getPasswd() + "');";
//        db.execSQL(sql);
//    }
// 
//    // 데이터 갱신 - 원본(샘플)
//    public void updateData(APinfo info, int index) {
//        String sql = "update " + tableName + " set SSID = '" + info.getSSID()
//                + "', capabilities = " + info.getCapabilities()
//                + ", passwd = '" + info.getPasswd() + "' where id = " + index
//                + ";";
//        db.execSQL(sql);
//    }
// 
//    // 데이터 삭제 - 원본(샘플)
//    public void removeData(int index) {
//        String sql = "delete from " + tableName + " where id = " + index + ";";
//        db.execSQL(sql);
//    }
// 
//    // 데이터 검색 - 원본(샘플)
//    public APinfo selectData(int index) {
//        String sql = "select * from " + tableName + " where id = " + index
//                + ";";
//        Cursor result = db.rawQuery(sql, null);
// 
//        // result(Cursor 객체)가 비어 있으면 false 리턴
//        if (result.moveToFirst()) {
//            APinfo info = new APinfo(result.getInt(0), result.getString(1),
//                    result.getInt(2), result.getString(3));
//            result.close();
//            return info;
//        }
//        result.close();
//        return null;
//    }
// 
//    // 데이터 전체 검색 - 원본(샘플)
//    public ArrayList<APinfo> selectAll() {
//        String sql = "select * from " + tableName + ";";
//        Cursor results = db.rawQuery(sql, null);
// 
//        results.moveToFirst();
//        ArrayList<APinfo> infos = new ArrayList<APinfo>();
// 
//        while (!results.isAfterLast()) {
//            APinfo info = new APinfo(results.getInt(0), results.getString(1),
//                    results.getInt(2), results.getString(3));
//            infos.add(info);
//            results.moveToNext();
//        }
//        results.close();
//        return infos;
//    }
  
  

  
  
}


/*
 *   액티비티에서의 호출 - 원본(샘플) 
 *   DBManager manager = new DBManager(this);
 *   manager.updateData(newInfo, index);
 *   manager.insertData(newInfo);  // 액티비티에서 이렇게 사용
 *   
 */